package cn.kgc;

import java.util.concurrent.*;

/**
 * @author wangyue
 * @version 1.0
 */
public class Demo2 {
    public static void main(String[] args) throws  Exception{
          m2();
    }

    private static void m2() {
        //创建线程数为10的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        //向线程池中提交任务
        Future<String> future= executorService.submit(()->{
            System.out.println("线程中的子任务开始处理...");
            Thread.sleep(10000);
            System.out.println("线程中的子任务处理结束...");
            String name=Thread.currentThread().getName();
            System.out.println("当前线程名称为："+name);
            return name;
        });
        //获得线程池中线程任务执行的返回结果(等待5s 如果超过5s还没有返回结果则抛出异常)
        try {
            String name= future.get(5,TimeUnit.SECONDS);
            System.out.println("从任务中获得返回结果:"+name);
        }catch (InterruptedException e) {
            //get方法最多等待5s获得任务的返回结果,如果在等待的过程中被中断了,处理中断异常。
            throw new RuntimeException(e);
        }catch (ExecutionException e) {
            //任务执行时产生的异常
            throw new RuntimeException(e);
        }catch (TimeoutException e) {
            //get方法最多等待5s获得任务的返回结果,如果在等待的过程中超时了,将任务强制取消。
            future.cancel(true);
        }finally{
            if(future.isCancelled()){
                System.out.println("任务已经被成功取消了");
            }else{
                System.out.println("任务取消失败");
            }
            //关闭线程池
            executorService.shutdown();
        }
    }

    private static void m1() throws InterruptedException, ExecutionException {
        //创建只有一个线程的线程池
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        //向线程池中提交一个任务
        Future<Object> future= executorService.submit(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                //线程走到此位置休眠10s
                Thread.sleep(10000);
                //获得当前线程的名字
                String name = Thread.currentThread().getName();
                System.out.println("当前线程名称为："+name);
                return name;
            }
        });
        //获得线程池中线程任务执行的返回结果
        Object o = future.get();
        System.out.println("线程任务执行的结果为："+o);
        //关闭线程池
        executorService.shutdown();
    }
}
